package gcp.gui;

import gcp.Amigo;
import gcp.Colecionavel;
import gcp.Emprestimo;
import gcp.Pessoa;
import gcp.enums.ItemEstado;
import gcp.principal.FrameGCP;
import gcp.principal.GCP;

import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFormattedTextField;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;
import javax.swing.text.MaskFormatter;

/**
 * Entidade que representa um Frame para cadastrar e manter um cadastro de
 * Emprestimos.
 * @author Catharine Quintans.
 */
public class FrameEmprestar extends JInternalFrame {

    private static final long serialVersionUID = 1L;

    private FrameGCP frameGcp;
    private GCP gcp;
    private Container tela;

    private JLabel textoTitulo, textoQuemPegou, textoDataEmprestimo,
            textoComentarios;
    private JTextField campoDataDeEmprestimo;
    private JTextArea campoComentarios;
    private JComboBox comboQuemPegou, comboItens;
    private JScrollPane barraDeRolagem;
    private JButton botaoOk, botaoSair, botaoLimpar;
    private Emprestimo emprestimo;

    /**
     * Contrutor para FrameEmprestimo
     * @param frameGcp
     * @param emprestimo
     */
    public FrameEmprestar(FrameGCP frameGcp, Emprestimo emprestimo) {
        super("Emprestar");
        this.frameGcp = frameGcp;
        this.emprestimo = emprestimo;
        gcp = frameGcp.getGcp();
        inicializar();
        posicoes();
        acoes();
        constroiTela();
        carregar();
    }

    /**
     * Incializacao dos componentes para o FrameEmprestimo.
     */
    private void inicializar() {
        setSize(600, 500);
        setClosable(true);
        tela = getContentPane();
        tela.setLayout(null);

        textoDataEmprestimo = new JLabel("Data do empréstimo: ");
        textoComentarios = new JLabel("Comentários Adicionais: ");
        textoTitulo = new JLabel("Título: ");
        textoQuemPegou = new JLabel("Emprestado à: ");

        campoComentarios = new JTextArea(200, 700);
        campoComentarios.setLineWrap(true);
        campoComentarios.setWrapStyleWord(true);

        barraDeRolagem = new JScrollPane(campoComentarios);
        barraDeRolagem
                .setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

        botaoOk = new JButton("Ok");
        botaoLimpar = new JButton("Limpar");
        botaoSair = new JButton("sair");

        comboQuemPegou = new JComboBox();
        comboItens = new JComboBox();

        campoDataDeEmprestimo = criarCampoData();

        List<Amigo> amigos = gcp.getListAmigo(frameGcp.getUsuarioLogado());
        if (amigos != null) {
            for (Amigo amigo : amigos) {
                comboQuemPegou.addItem(amigo);
            }
        }
        List<Colecionavel> itens = gcp.getList(frameGcp.getUsuarioLogado());
        if (itens != null) {
            for (Colecionavel item : itens) {
                if (item.getItemEstado() == ItemEstado.COMIGO)
                    comboItens.addItem(item);
            }
        }

        campoDataDeEmprestimo.setText(new SimpleDateFormat("dd/MM/yyyy")
                .format(new Date()));
    }

    /**
     * Cria um campo com a mascara para manipulacao de datas no FrameEmprestimo.
     */
    private JTextField criarCampoData() {
        try {
            MaskFormatter mascaraData = new MaskFormatter("**/**/****");
            mascaraData.setPlaceholderCharacter('_');
            mascaraData.setValidCharacters("0123456789 _");
            JFormattedTextField retorno = new JFormattedTextField(mascaraData);
            return retorno;
        } catch (ParseException e) {
            JFormattedTextField retorno = new JFormattedTextField();
            return retorno;
        }
    }

    /**
     * Cria as posicoes dos componentes no FrameEmprestimo.
     */
    private void posicoes() {

        textoDataEmprestimo.setBounds(0, 10, 120, 27);
        campoDataDeEmprestimo.setBounds(120, 10, 75, 27);

        textoTitulo.setBounds(10, 40, 120, 27);
        comboItens.setBounds(120, 40, 450, 27);

        textoQuemPegou.setBounds(10, 70, 120, 27);
        comboQuemPegou.setBounds(120, 70, 450, 27);

        textoComentarios.setBounds(10, 100, 200, 27);
        barraDeRolagem.setBounds(10, 130, 300, 200);

        botaoOk.setBounds(440, 300, 100, 27);
        botaoLimpar.setBounds(440, 340, 100, 27);
        botaoSair.setBounds(440, 380, 100, 27);
    }

    /**
     * Indica as acoes dos botoes do FrameEmprestimo.
     */
    private void acoes() {

        // Ao apertar o botao ok confirmar o cadastro do Emprestimo
        botaoOk.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                cadastrar();
            }
        });

        // Ao apertar o botao limpar limpa os campos preenchidos
        botaoLimpar.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                campoDataDeEmprestimo.setText(null);
                comboItens.setSelectedItem("");
                campoDataDeEmprestimo.setText(null);
                comboItens.setSelectedItem("");
                campoComentarios.setText(null);
            }
        });

        // fecha a janela ao apertar o botao sair
        botaoSair.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                dispose();
            }
        });
    }

    /**
     * Carrega os dados do Emprestimo FrameEmprestimo.
     */
    private void carregar() {
        if (emprestimo != null) {
            comboItens.setSelectedItem(emprestimo.getItem());
            comboQuemPegou.setSelectedItem(emprestimo.getProprietario());
            comboItens.setSelectedItem(emprestimo.getEmprestadoA());
            campoComentarios.setText(emprestimo.getComentarios());
        }
    }

    /**
     * Cria um Emprestimo e Adiciona as informacoes obtidas ao cadastro do
     * Emprestimo.
     * 
     **/
    @SuppressWarnings("deprecation")
    protected void cadastrar() {
        boolean novo = emprestimo == null;
        String dataNascimento = campoDataDeEmprestimo.getText();
        String comentarios = campoComentarios.getText();

        Date date;
        try {
            date = new SimpleDateFormat("dd/MM/yyyy").parse(dataNascimento);
            if (date.getDay() <= 0 || date.getDay() > 31 || date.getMonth() < 0
                    || date.getMonth() > 11 || date.getYear() + 1900 < 1900
                    || date.getYear() + 1900 > 2100) {
                frameGcp.exibirMensagem("A data de empréstimo não é válida.");
                return;
            }
        } catch (ParseException e) {
            frameGcp.exibirMensagem("Data de empréstimo inválida.");
            return;
        }
        if (novo)
            emprestimo = new Emprestimo();
        emprestimo.setDataDeEmprestimo(date);

        try {
            emprestimo.setProprietario(frameGcp.getUsuarioLogado());
            emprestimo
                    .setEmprestadoA((Pessoa) comboQuemPegou.getSelectedItem());
            Colecionavel item = (Colecionavel) comboItens.getSelectedItem();
            item.setItemEstado(ItemEstado.EMPRESTADO);
            emprestimo.setItem(item);
            emprestimo.setComentarios(comentarios);

            if (novo)
                gcp.adicionaEmprestimo(emprestimo);
            dispose();
        } catch (Exception e) {
            e.printStackTrace();
            frameGcp.exibirMensagem(e.getMessage());
        }
    }

    /**
     * Adiciona os componentes no FrameEmprestimo.
     */
    private void constroiTela() {
        tela.add(textoDataEmprestimo);
        tela.add(textoTitulo);
        tela.add(textoQuemPegou);
        tela.add(textoComentarios);

        tela.add(campoDataDeEmprestimo);

        tela.add(botaoOk);
        tela.add(botaoLimpar);
        tela.add(botaoSair);

        tela.add(comboItens);
        tela.add(comboQuemPegou);

        tela.add(barraDeRolagem);
    }
}